﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.IO;
using System.Threading;
using System.Runtime;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Contexts;
using System.Runtime.Remoting.Activation;

namespace PickGold
{
	/// <summary>
	/// 标识上下文属性。
	/// 从上下文属性收集命名信息，并确定新上下文是否与上下文属性兼容。
	/// 指示实现的属性要参与激活而且可能未提供消息接收器。
	/// </summary>
	public class ContextPropertyAttribute : Attribute, IContextAttribute, IContextProperty, IContextPropertyActivator
	{
		/// <summary>
		/// 获取将属性添加到上下文中时使用的属性名称。
		/// </summary>
		public string Name;
		/// <summary>
		/// 获取将属性添加到上下文中时使用的属性值。
		/// </summary>
		public object Value;

		public ContextPropertyAttribute(string name, object value)
		{
			this.Name = name;
			this.Value = value;
		}

		string IContextProperty.Name
		{
			get
			{
				return this.Name;
			}
		}

		/// <summary>
		/// 当上下文冻结时调用。
		/// </summary>
		/// <param name="newContext">要冻结的上下文。</param>
		public virtual void Freeze(Context newContext)
		{
		}

		/// <summary>
		/// 返回一个指示上下文属性是否与新上下文兼容的布尔值。
		/// </summary>
		/// <param name="newCtx">已在其中创建 ContextProperty 的新上下文。</param>
		/// <returns>如果该上下文属性可以与给定的上下文中的其他上下文属性共存，则为 true；否则为 false。</returns>
		public virtual bool IsNewContextOK(Context newCtx)
		{
			return true;
		}

		/// <summary>
		/// 在构造请求离开客户端前，调协用每个具有此接口的客户端上下文属性。
		/// </summary>
		/// <param name="msg">一个 IConstructionCallMessage 对象。</param>
		public virtual void CollectFromClientContext(IConstructionCallMessage msg)
		{
		}

		/// <summary>
		/// 在构造响应离开服务器返回客户端前，调用每个具有此接口的服务器上下文属性。
		/// </summary>
		/// <param name="msg">一个 IConstructionReturnMessage 对象。</param>
		public virtual void CollectFromServerContext(IConstructionReturnMessage msg)
		{
		}

		/// <summary>
		/// 当构造请求从服务器返回到客户端时，调用每个具有此接口的客户端上下文属性。
		/// </summary>
		/// <param name="msg">一个 IConstructionCallMessage 对象。</param>
		/// <returns>如果成功，则为 true；否则为 false。</returns>
		public virtual bool DeliverClientContextToServerContext(IConstructionCallMessage msg)
		{
			return true;
		}

		/// <summary>
		/// 当构造请求从服务器返回到客户端时，调用每个具有此接口的客户端上下文属性。
		/// </summary>
		/// <param name="msg">一个 IConstructionReturnMessage 对象。</param>
		/// <returns>如果成功，则为 true；否则为 false。</returns>
		public virtual bool DeliverServerContextToClientContext(IConstructionReturnMessage msg)
		{
			return true;
		}

		/// <summary>
		/// 指示是否可以激活 msg 参数中指示的对象类型。
		/// </summary>
		/// <param name="msg">一个 IConstructionCallMessage 对象。</param>
		/// <returns>指示是否可以激活所请求类型的布尔值。</returns>
		public virtual bool IsOKToActivate(IConstructionCallMessage msg)
		{
			return true;
		}

		/// <summary>
		/// 在给定消息中将上下文属性返回给调用方。
		/// </summary>
		/// <param name="msg">将上下文属性添加到的 IConstructionCallMessage。</param>
		public virtual void GetPropertiesForNewContext(IConstructionCallMessage msg)
		{
			//msg.LogicalCallContext.
		}

		/// <summary>
		/// 返回一个布尔值，指示指定上下文是否满足上下文属性的要求。
		/// </summary>
		/// <param name="ctx">当前上下文属性检查所依据的上下文。</param>
		/// <param name="msg">构造调用，需要依据当前上下文检查其参数。</param>
		/// <returns>如果传入的上下文一切正常，则为 true；否则为 false。</returns>
		public virtual bool IsContextOK(Context ctx, IConstructionCallMessage msg)
		{
			return true;
		}
	}
}
